//
//  Person3.swift
//  swift-02
//
//  Created by China Dragon on 2023/8/19.
//

import UIKit

/*
 便利构造函数的基本使用
 
 链接：https://www.jianshu.com/p/b14d2430689e
 convenience:便利，使用convenience修饰的构造函数叫做便利构造函数
 便利构造函数通常用在对系统的类进行构造函数的扩充时使用。
 便利构造函数的特点：
 1、便利构造函数通常都是写在extension里面
 2、便利函数init前面需要加载convenience
 3、在便利构造函数中需要明确的调用self.init()
 */
class Person3: NSObject {
    @objc var name:String?
    @objc var age:Int = 20
    
    init(dic:[String: Any]){
        
        //kvc 是 oc 特有的，本质是在运行时，动态的给对象发送  setValue：forkey消息
        //设置数值- 调用  super.init()  保证对象已经被创建完成
        super.init()//使用setValuesForKeys 这里必先调用
        //KVC 设置数值
        setValuesForKeys(dic)// 代替以前的 setValuesForKeysWithDictionary
        
    }
    
    /*
     convenience遍历构造函数 作用
     1、能够提供条件检测
     2、允许返回nil的默认（指定）构造函数，必须要创建对象
     3、便利构造函数  必须在条件检测之后 以 self。 的方式调用其他的构造函数来创建对象
     4、可以简化创建对象
     
     */
    convenience init?(name: String? = nil, age: Int) {
        
        if(age <= 0 || age > 100){
            return nil
        }
//        self.name = name
//        self.age = age
        self.init(dic: ["name":name, "age":age])
    }
    
    /*
    oc里的 dealloc 对象释放的方法
    deinit 与 dealloc类似，主要是负责对象被销毁之前的内存释放工作
    没有func
    没有（）， 不允许重载，不允许代参数，不允许直接调用，在系统内部自动调用
     
     在实际开发中需要程序员主动释放的内容
     - 通知：如果不释放，程序不会崩溃
     - KVO：如果不释放，程序会崩溃
     - NSTimer，会对 target(self), 进行强引用
     
     
     */
    deinit{
        print(" person3 deinit 调用了")
        
        //Person3对象所在的方法作用域结束后会调用此方法
    }
}
